home *** CD-ROM | disk | FTP | other *** search
/ Pascal Super Library / Pascal Super Library (CW International)(1997).bin / DELPHI32 / AUDIO / MIDICOM2 / MIDIMONP.PAS < prev    next >
Pascal/Delphi Source File  |  1996-04-30  |  4KB  |  187 lines

  1. { $Header:   G:/delphi/midi/vcs/midimonp.pas   1.12   30 Apr 1996 19:04:56   DAVEC  $ }
  2.  
  3. { This demo shows how MidiInput and MidiOutput components can be used
  4.   interactively at design time on a form.
  5.   The monitor has one TMidiInput control whose device ID is set interactively
  6.   at runtime using a combo box.
  7.   Anything received on the input device, including sysex data, is displayed by
  8.   the monitor and echoed to the selected output device. }
  9.  
  10. unit Midimonp;
  11.  
  12. interface
  13.  
  14. uses
  15.   SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls,
  16.   Forms, Dialogs, MMSystem, StdCtrls, MIDIIn, MidiOut, ExtCtrls,
  17.   Menus, monprocs, MidiType;
  18.  
  19. type
  20.   TForm1 = class(TForm)
  21.     MIDIInput1: TMIDIInput;
  22.     lstLog: TListBox;
  23.     pnlColumnHeading: TPanel;
  24.     MidiOutput1: TMidiOutput;
  25.     MainMenu1: TMainMenu;
  26.     File1: TMenuItem;
  27.     mnuExit: TMenuItem;
  28.     Label1: TLabel;
  29.     cmbInput: TComboBox;
  30.     cmbOutput: TComboBox;
  31.     Bevel1: TBevel;
  32.     procedure MIDIInput1MidiInput(Sender: TObject);
  33.     procedure LogMessage(ThisEvent:TMyMidiEvent);
  34.     procedure FormCreate(Sender: TObject);
  35.     procedure FormResize(Sender: TObject);
  36.     procedure FormClose(Sender: TObject; var Action: TCloseAction);
  37.     procedure mnuExitClick(Sender: TObject);
  38.     procedure cmbInputChange(Sender: TObject);
  39.     procedure OpenDevs;
  40.     procedure CloseDevs;
  41.   private
  42.     logItemMax: Integer;
  43.   public
  44.     { Public declarations }
  45.   end;
  46.  
  47. var
  48.   Form1: TForm1;
  49.   inh: HMidiIn;
  50.  
  51. implementation
  52.  
  53. {$R *.DFM}
  54.  
  55.  
  56. procedure TForm1.LogMessage(ThisEvent:TMyMidiEvent);
  57. { Logging MIDI messages with a Windows list box is rather slow and ugly,
  58.   but it makes the example very simple.  If you need a faster and less
  59.   flickery log you could port the rest of Microsoft's MIDIMON.C example. }
  60. begin
  61.     if logItemMax > 0 then
  62.         begin
  63.         With lstLog.Items do
  64.             begin
  65.             if Count >= logItemMax then
  66.                 Delete(0);
  67.             Add(MonitorMessageText(ThisEvent));
  68.             end;
  69.         end;
  70. end;
  71.  
  72. procedure TForm1.MIDIInput1MidiInput(Sender: TObject);
  73. var
  74.     thisEvent: TMyMidiEvent;
  75. begin
  76.     with (Sender As TMidiInput) do
  77.         begin
  78.         while (MessageCount > 0) do
  79.             begin
  80.  
  81.             { Get the event as an object }
  82.             thisEvent := GetMidiEvent;
  83.  
  84.             { Log it }
  85.             LogMessage(thisEvent);
  86.  
  87.             { Echo to the output device }
  88.             MidiOutput1.PutMidiEvent(thisEvent);
  89.  
  90.             { Event was dynamically created by GetMyMidiEvent so must
  91.                 free it here }
  92.             thisEvent.Free;
  93.  
  94.             end;
  95.         end;
  96. end;
  97.  
  98. procedure TForm1.OpenDevs;
  99. begin
  100.     { Use selected devices }
  101.     MidiInput1.ProductName := cmbInput.Text;
  102.     MidiOutput1.ProductName := cmbOutput.Text;
  103.     { Open devices }
  104.     MidiInput1.Open;
  105.     MidiInput1.Start;
  106.     MidiOutput1.Open;
  107. end;
  108.  
  109. procedure TForm1.CloseDevs;
  110. begin
  111.     MidiInput1.Close;
  112.     MidiOutput1.Close;
  113. end;
  114.  
  115.  
  116. procedure TForm1.FormCreate(Sender: TObject);
  117. var
  118.     thisDevice: Word;
  119. begin
  120.      Cursor := crHourglass;
  121.  
  122.     { Load the lists of installed MIDI devices }
  123.     cmbInput.Clear;
  124.     for thisDevice := 0 To MidiInput1.NumDevs - 1 do
  125.         begin
  126.         MidiInput1.DeviceID := thisDevice;
  127.         cmbInput.Items.Add(MidiInput1.ProductName);
  128.         end;
  129.     cmbInput.ItemIndex := 0;
  130.     cmbOutput.Clear;
  131.     for thisDevice := 0 To MidiOutput1.NumDevs - 1 do
  132.         begin
  133.         MidiOutput1.DeviceID := thisDevice;
  134.         cmbOutput.Items.Add(MidiOutput1.ProductName);
  135.         end;
  136.     cmbOutput.ItemIndex := 0;
  137.     OpenDevs;
  138.  
  139.      Cursor := crDefault;
  140. end;
  141.  
  142. procedure TForm1.FormResize(Sender: TObject);
  143. var
  144.     logTop: Integer;
  145. const
  146.     logMargin = 8;
  147. begin
  148.     { Set maximum items that can be stored in the list box without scrolling }
  149.     if lstLog.ItemHeight > 0 then
  150.         begin
  151.         logItemMax := (lstLog.Height div lstLog.ItemHeight)-1;
  152.         { If there are currently more items than the max, remove them
  153.           otherwise the list will have scrollbars when resized }
  154.         with lstLog.Items do
  155.             begin
  156.             while (Count >= logItemMax) and (Count > 0) do
  157.                 Delete(0);
  158.                 end;
  159.             end
  160.     else
  161.         logItemMax := 0;
  162. end;
  163.  
  164. procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
  165. begin
  166.     { This is not strictly necessary since the objects close themselves
  167.       when the form containing them is destroyed }
  168.     CloseDevs;
  169. end;
  170.  
  171. procedure TForm1.mnuExitClick(Sender: TObject);
  172. begin
  173.     Application.Terminate;
  174. end;
  175.  
  176.  
  177. procedure TForm1.cmbInputChange(Sender: TObject);
  178. begin
  179.     { Close and reopen devices with changed device selection }
  180.     Cursor := crHourglass;
  181.     CloseDevs;
  182.     OpenDevs;
  183.     Cursor := crDefault;
  184. end;
  185.  
  186. end.
  187.